%     FASTENER DOCTOR - программа для лечения и конвертации крепежа
%     Copyright (C) 2018  Михаил Козлов
%     Сайт проекта: <http://www.fastenerdoctor.ru/>
%     Адрес электронной почты для связи с разработчиком:
%     <doctor.fastener@gmail.com>
% 
%     Эта программа является свободным программным обеспечением: Вы можете
%     распространять ее и/или изменять, соблюдая условия Универсальной общественной
%     лицензии GNU, опубликованной Фондом свободного программного обеспечения,
%     либо редакции 3, либо (на Ваше усмотрение) любой редакции, выпущенной позже.
% 
%     Эта программа распространяется в надежде на то, что она окажется полезной,
%     но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, включая даже подразумеваемую гарантию ТОВАРНОЙ ПРИГОДНОСТИ,
%     либо ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Ознакомьтесь с Универсальной общественной
%     лицензией GNU для получения более подробной информации.
% 
%     Вы должны были получить копию Универсальной общественной лицензии GNU
%     вместе с этой программой. Если Вы ее не получили, то перейдите по адресу:
%     <http://www.gnu.org/licenses/>.
% 
%     This program is free software: you can redistribute it and/or modify
%     it under the terms of the GNU General Public License as published by
%     the Free Software Foundation, either version 3 of the License, or
%     (at your option) any later version.
% 
%     This program is distributed in the hope that it will be useful,
%     but WITHOUT ANY WARRANTY; without even the implied warranty of
%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
%     GNU General Public License for more details.
% 
%     You should have received a copy of the GNU General Public License
%     along with this program.  If not, see <https://www.gnu.org/licenses/>.

function MPC = Read_MPC(Fin, N_MPC, MPC_start_position, MPC_ID_Conflict_counter, MPC_ID_Conflict_start_position)

% MPC (карточка RBAR) | .card | .ID | .Nastran_ID | .GA | .GB | .CNA | .CNB | .CMA | .CMB | .ALPHA |
% MPC (карточка RBE2) | .card | .ID | .Nastran_ID | .GN | .CM | .GM(:,1) | .ALPHA |
% MPC (карточка RBE3) | .card | .ID | .Nastran_ID | .REFGRID | .REFC | .INDEP_DATA{:,1} | .ALPHA |
%      .INDEP_DATA{i} | .WT | .C | .G(:,1) |

global ErrCode;
global Progress_Bar_Segments;
global Progress_Bar_Delay;

fprintf (1, '    Чтение MPC...                       ');

% Настройки первоначального выделения памяти (для ускорения чтения)
N_RBE2_grids_preallocated = 10000; % число завиcимых узлов в RBE2
N_RBE3_cells_preallocated = 50; % число наборов независимых узлов RBE3 с одинаковыми весовыми коэффициентами
N_RBE3_grids_in_cell_preallocated = 100000; % число узлов в каждом таком наборе

MPC = cell(N_MPC,1);

if (MPC_ID_Conflict_start_position < MPC_start_position)
    fseek(Fin, MPC_ID_Conflict_start_position, 'bof');
else
    fseek(Fin, MPC_start_position, 'bof');
end

MPC_read_counter = 0;
Read_Prev_String_ID_counter = 0;

string = ' ';


% Для вывода прогресса
Time_segments = Progress_Bar_Segments;
N_records = N_MPC;
N_rec_segm = floor(N_records/Time_segments);
Counter = 0;
Counter_2 = 0;
Written_count = 0;


while (~feof(Fin))
    
    if (MPC_read_counter == N_MPC)
        break;        
    end
    
    previous_string = string;
    string = fgets(Fin);
    
    if (string(1) == 'R')
    
        % Чтение RBAR
    
        if ((length(string) >= 5) && strcmp(string(2:5), 'BAR ')) % SMALL FIELD FORMAT
            
            MPC_read_counter = MPC_read_counter + 1;
            
            MPC{MPC_read_counter}.card = 'RBAR';
            MPC{MPC_read_counter}.ID = [];
            MPC{MPC_read_counter}.Nastran_ID = [];
            MPC{MPC_read_counter}.GA = [];
            MPC{MPC_read_counter}.GB = [];
            MPC{MPC_read_counter}.CNA = [];
            MPC{MPC_read_counter}.CNB = [];
            MPC{MPC_read_counter}.CMA = [];
            MPC{MPC_read_counter}.CMB = [];
            MPC{MPC_read_counter}.ALPHA = [];

            % Чтение ID
            if  ((length(previous_string) >= 38) && strcmp(previous_string(2:37), ' ID conflict : the PATRAN MPC ID was')) % здесь нет ошибки с 38 и 37
                
                tmp_number = str2double(previous_string(38:length(previous_string)));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером MPC в базе Patran в строке [%s] перед карточкой RBAR !\n', previous_string(38:length(previous_string)));
                    ErrCode = -1;
                    return;
                end
                MPC{MPC_read_counter}.ID = tmp_number;
                
                Read_Prev_String_ID_counter = Read_Prev_String_ID_counter + 1;
                
                tmp_number = str2double(string(9:16));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером MPC в карточке RBAR : [%s] !\n', strtrim(string(9:16)));
                    ErrCode = -1;
                    return;
                end
                MPC{MPC_read_counter}.Nastran_ID = tmp_number; 
                
            else
                
                tmp_number = str2double(string(9:16));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером MPC в карточке RBAR : [%s] !\n', strtrim(string(9:16)));
                    ErrCode = -1;
                    return;
                end
                MPC{MPC_read_counter}.ID = tmp_number;
                MPC{MPC_read_counter}.Nastran_ID = tmp_number; 
                
            end
            
            % Чтение GA
            tmp_number = str2double(string(17:24));
            if (isnan(tmp_number))
                fprintf (1, '\nНеправильная запись GA в карточке RBAR %i : [%s] !\n', MPC{MPC_read_counter}.ID, strtrim(string(17:24)));
                ErrCode = -1;
                return;
            end
            MPC{MPC_read_counter}.GA = tmp_number;
            
            % Чтение GB
            if (length(string) < 32)
                End_index = length(string);
            else
                End_index = 32;
            end
            tmp_number = str2double(string(25:End_index));
            if (isnan(tmp_number))
                fprintf (1, '\nНеправильная запись GB в карточке RBAR %i : [%s] !\n', MPC{MPC_read_counter}.ID, strtrim(string(25:End_index)));
                ErrCode = -1;
                return;
            end
            MPC{MPC_read_counter}.GB = tmp_number;
            
            % Чтение CNA
            if (length(Trim_CR_LF(string)) > 32)
                if (length(string) < 40)
                    End_index = length(string);
                else
                    End_index = 40;
                end
                if (~isnan(str2double(string(33:End_index))))
                    MPC{MPC_read_counter}.CNA = str2double(string(33:End_index));
                end
            end
            
            % Чтение CNB
            if (length(Trim_CR_LF(string)) > 40)
                if (length(string) < 48)
                    End_index = length(string);
                else
                    End_index = 48;
                end
                if (~isnan(str2double(string(41:End_index))))
                    MPC{MPC_read_counter}.CNB = str2double(string(41:End_index));
                end
            end
            
            % Чтение CMA
            if (length(Trim_CR_LF(string)) > 48)
                if (length(string) < 56)
                    End_index = length(string);
                else
                    End_index = 56;
                end
                if (~isnan(str2double(string(49:End_index))))
                    MPC{MPC_read_counter}.CMA = str2double(string(49:End_index));
                end
            end
            
            % Чтение CMB
            if (length(Trim_CR_LF(string)) > 56)
                if (length(string) < 64)
                    End_index = length(string);
                else
                    End_index = 64;
                end
                if (~isnan(str2double(string(57:End_index))))
                    MPC{MPC_read_counter}.CMB = str2double(string(57:End_index));
                end
            end
            
            % Чтение ALPHA
            if (length(Trim_CR_LF(string)) > 64)
                if (length(string) < 72)
                    End_index = length(string);
                else
                    End_index = 72;
                end
                tmp_number = str2double(string(65:End_index));
                if (isnan(tmp_number))
                    tmp_number_2 = sscanf(string(65:End_index), '%e%d');
                    if (size(tmp_number_2,1) ~= 2)
                        fprintf (1, '\nНеправильная запись ALPHA в карточке RBAR %i : [%s] !\n', MPC{MPC_read_counter}.ID, strtrim(string(65:End_index)));
                        ErrCode = -1;
                        return;
                    end
                    MPC{MPC_read_counter}.ALPHA = tmp_number_2(1)*10^tmp_number_2(2);
                else
                    MPC{MPC_read_counter}.ALPHA = tmp_number;
                end
            end
            
            
            % Для вывода прогресса
            Counter = Counter + 1;
            Counter_2 = Counter_2 + 1;
            if (Counter_2 == N_rec_segm)
                Counter_2 = 0;
                Written_count = Written_count + 1;
                if (Written_count < Time_segments)
                    fprintf (1, '#');
                    pause (Progress_Bar_Delay);
                end
            end
            
            
            continue;

        end
    
        if ((length(string) >= 5) && strcmp(string(2:5), 'BAR*')) % LARGE FIELD FORMAT
            
            MPC_read_counter = MPC_read_counter + 1;
            
            MPC{MPC_read_counter}.card = 'RBAR';
            MPC{MPC_read_counter}.ID = [];
            MPC{MPC_read_counter}.Nastran_ID = [];
            MPC{MPC_read_counter}.GA = [];
            MPC{MPC_read_counter}.GB = [];
            MPC{MPC_read_counter}.CNA = [];
            MPC{MPC_read_counter}.CNB = [];
            MPC{MPC_read_counter}.CMA = [];
            MPC{MPC_read_counter}.CMB = [];
            MPC{MPC_read_counter}.ALPHA = [];
            
            % Чтение ID
            if  ((length(previous_string) >= 38) && strcmp(previous_string(2:37), ' ID conflict : the PATRAN MPC ID was')) % здесь нет ошибки с 38 и 37
                
                tmp_number = str2double(previous_string(38:length(previous_string)));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером MPC в базе Patran в строке [%s] перед карточкой RBAR* !\n', previous_string(38:length(previous_string)));
                    ErrCode = -1;
                    return;
                end
                MPC{MPC_read_counter}.ID = tmp_number;
                
                Read_Prev_String_ID_counter = Read_Prev_String_ID_counter + 1;
                
                tmp_number = str2double(string(9:24));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером MPC в карточке RBAR* : [%s] !\n', strtrim(string(9:24)));
                    ErrCode = -1;
                    return;
                end
                MPC{MPC_read_counter}.Nastran_ID = tmp_number;
                
            else
                
                tmp_number = str2double(string(9:24));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером MPC в карточке RBAR* : [%s] !\n', strtrim(string(9:24)));
                    ErrCode = -1;
                    return;
                end
                MPC{MPC_read_counter}.ID = tmp_number;
                MPC{MPC_read_counter}.Nastran_ID = tmp_number;
                
            end
            
            % Чтение GA
            tmp_number = str2double(string(25:40));
            if (isnan(tmp_number))
                fprintf (1, '\nНеправильная запись GA в карточке RBAR* %i : [%s] !\n', MPC{MPC_read_counter}.ID, strtrim(string(25:40)));
                ErrCode = -1;
                return;
            end
            MPC{MPC_read_counter}.GA = tmp_number;
            
            % Чтение GB
            if (length(string) < 56)
                End_index = length(string);
            else
                End_index = 56;
            end
            tmp_number = str2double(string(41:End_index));
            if (isnan(tmp_number))
                fprintf (1, '\nНеправильная запись GB в карточке RBAR* %i : [%s] !\n', MPC{MPC_read_counter}.ID, strtrim(string(41:End_index)));
                ErrCode = -1;
                return;
            end
            MPC{MPC_read_counter}.GB = tmp_number;
            
            % Чтение CNA
            if (length(Trim_CR_LF(string)) > 56)
                if (length(string) < 72)
                    End_index = length(string);
                else
                    End_index = 72;
                end
                if (~isnan(str2double(string(57:End_index))))
                    MPC{MPC_read_counter}.CNA = str2double(string(57:End_index));
                end
            end
            
            % Проверка на конец файла
            if (feof(Fin))
                fprintf (1, '\nНеожиданный конец файла во время чтения карточки RBAR* с номером %i !\n', MPC{MPC_read_counter}.ID);
                ErrCode = -1;
                return;
            end
            
            % Чтение следующей строки
            previous_string = string;
            string = fgets(Fin);
            
            % Проверка строки
            if (~(string(1) == '*'))
                fprintf (1, '\nВторая строка в карточке RBAR* %i не начинается с символа * !\n', MPC{MPC_read_counter}.ID);
                ErrCode = -1;
                return;
            end
            
            % Чтение CNB
            if (length(Trim_CR_LF(string)) > 8)
                if (length(string) < 24)
                    End_index = length(string);
                else
                    End_index = 24;
                end
                if (~isnan(str2double(string(9:End_index))))
                    MPC{MPC_read_counter}.CNB = str2double(string(9:End_index));
                end
            end
            
            % Чтение CMA
            if (length(Trim_CR_LF(string)) > 24)
                if (length(string) < 40)
                    End_index = length(string);
                else
                    End_index = 40;
                end
                if (~isnan(str2double(string(25:End_index))))
                    MPC{MPC_read_counter}.CMA = str2double(string(25:End_index));
                end
            end
            
            % Чтение CMB
            if (length(Trim_CR_LF(string)) > 40)
                if (length(string) < 56)
                    End_index = length(string);
                else
                    End_index = 56;
                end
                if (~isnan(str2double(string(41:End_index))))
                    MPC{MPC_read_counter}.CMB = str2double(string(41:End_index));
                end
            end
            
            % Чтение ALPHA
            if (length(Trim_CR_LF(string)) > 56)
                if (length(string) < 72)
                    End_index = length(string);
                else
                    End_index = 72;
                end
                tmp_number = str2double(string(57:End_index));
                if (isnan(tmp_number))
                    tmp_number_2 = sscanf(string(57:End_index), '%e%d');
                    if (size(tmp_number_2,1) ~= 2)
                        fprintf (1, '\nНеправильная запись ALPHA в карточке RBAR* %i : [%s] !\n', MPC{MPC_read_counter}.ID, strtrim(string(57:End_index)));
                        ErrCode = -1;
                        return;
                    end
                    MPC{MPC_read_counter}.ALPHA = tmp_number_2(1)*10^tmp_number_2(2);
                else
                    MPC{MPC_read_counter}.ALPHA = tmp_number;
                end
            end
            
            
            % Для вывода прогресса
            Counter = Counter + 1;
            Counter_2 = Counter_2 + 1;
            if (Counter_2 == N_rec_segm)
                Counter_2 = 0;
                Written_count = Written_count + 1;
                if (Written_count < Time_segments)
                    fprintf (1, '#');
                    pause (Progress_Bar_Delay);
                end
            end
            
            
            continue;
            
        end
        
        if ((length(string) >= 5) && strcmp(string(2:5), 'BAR,')) % FREE FIELD FORMAT
            
            fprintf (1, '\nОшибка функции Read_MPC: FREE FIELD FORMAT файла bdf не поддерживается в текущей версии программы [RBAR,] !\n');
            ErrCode = -1;
            return; 
            
        end
        
        % Чтение RBE2
    
        if ((length(string) >= 5) && strcmp(string(2:5), 'BE2 ')) % SMALL FIELD FORMAT
            
            MPC_read_counter = MPC_read_counter + 1;

            MPC{MPC_read_counter}.card = 'RBE2';
            MPC{MPC_read_counter}.ID = [];
            MPC{MPC_read_counter}.Nastran_ID = [];
            MPC{MPC_read_counter}.GN = [];
            MPC{MPC_read_counter}.CM = [];
            MPC{MPC_read_counter}.GM = zeros(N_RBE2_grids_preallocated,1);
            MPC{MPC_read_counter}.ALPHA = [];

            % Чтение ID
            if  ((length(previous_string) >= 38) && strcmp(previous_string(2:37), ' ID conflict : the PATRAN MPC ID was')) % здесь нет ошибки с 38 и 37

                tmp_number = str2double(previous_string(38:length(previous_string)));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером MPC в базе Patran в строке [%s] перед карточкой RBE2 !\n', previous_string(38:length(previous_string)));
                    ErrCode = -1;
                    return;
                end
                MPC{MPC_read_counter}.ID = tmp_number;

                Read_Prev_String_ID_counter = Read_Prev_String_ID_counter + 1;

                tmp_number = str2double(string(9:16));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером MPC в карточке RBE2 : [%s] !\n', strtrim(string(9:16)));
                    ErrCode = -1;
                    return;
                end
                MPC{MPC_read_counter}.Nastran_ID = tmp_number;

            else

                tmp_number = str2double(string(9:16));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером MPC в карточке RBE2 : [%s] !\n', strtrim(string(9:16)));
                    ErrCode = -1;
                    return;
                end
                MPC{MPC_read_counter}.ID = tmp_number;
                MPC{MPC_read_counter}.Nastran_ID = tmp_number;

            end

            % проверка на записи в 10-ом поле
            if (deblank(string) > 72)
                fprintf (1, '\nОбнаружена запись в поле 10 карточки RBE2 с номером %i !\n', MPC{MPC_read_counter}.ID);
                fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                fprintf (1, 'Обратетись к разработчику для решения этого вопроса.\n');
                ErrCode = -1;
                return;
            end

            % Чтение GN
            tmp_number = str2double(string(17:24));
            if (isnan(tmp_number))
                fprintf (1, '\nНеправильная запись GN в карточке RBE2 %i : [%s] !\n', MPC{MPC_read_counter}.ID, strtrim(string(17:24)));
                ErrCode = -1;
                return;
            end
            MPC{MPC_read_counter}.GN = tmp_number;

            % Чтение CM
            tmp_number = str2double(string(25:32));
            if (isnan(tmp_number))
                fprintf (1, '\nНеправильная запись CM в карточке RBE2 %i : [%s] !\n', MPC{MPC_read_counter}.ID, strtrim(string(25:32)));
                ErrCode = -1;
                return;
            end
            MPC{MPC_read_counter}.CM = tmp_number;

            % Чтение GMi
            First_GM_flag = 1;
            GM_counter = 0;

            % длина строки без конечных символов                    
            str_length = length(Trim_CR_LF(string));

            while (1)

                % установка начальных значений параметров
                if (First_GM_flag == 1)

                    First_GM_flag = 0;

                    last_index = 32;
                    record_length = 8;
                    next_string_large = 0;

                end

                % конец карточки в случае пустого поля
                if (last_index == str_length)
                    break;
                end

                % последний индекс поля
                if (last_index + record_length <= str_length)
                    end_index = last_index + record_length;
                else
                    end_index = str_length;
                end

                % проверка на ALPHA
                if (~isempty(strfind(string(last_index + 1:end_index), '.'))) %#ok<STREMP> % Для совместимости с GNU Octave вместо if (contains(string(last_index + 1:end_index), '.'))

                    tmp_number = str2double(string(last_index + 1:end_index));
                    if (isnan(tmp_number))
                        tmp_number_2 = sscanf(string(last_index + 1:end_index), '%e%d');
                        if (size(tmp_number_2,1) ~= 2)
                            fprintf (1, '\nНеправильная запись ALPHA в карточке RBE2 %i : [%s] !\n', MPC{MPC_read_counter}.ID, strtrim(string(last_index + 1:end_index)));
                            ErrCode = -1;
                            return;
                        end
                        MPC{MPC_read_counter}.ALPHA = tmp_number_2(1)*10^tmp_number_2(2);
                    else
                        MPC{MPC_read_counter}.ALPHA = tmp_number;
                    end

                    break; % конец карточки

                end

                % считывание GMi
                tmp_number = str2double(string(last_index + 1:end_index));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись GMi в карточке RBE2 %i : [%s] !\n', MPC{MPC_read_counter}.ID, strtrim(string(last_index + 1:end_index)));
                    ErrCode = -1;
                    return;
                end
                GM_counter = GM_counter + 1;
                MPC{MPC_read_counter}.GM(GM_counter) = tmp_number;

                % проверка на поле не полной длины, которое не является последним
                if ((end_index - last_index < record_length) && (last_index + 1 < 72 - record_length + 1))
                    break; % конец карточки
                end

                % флаг последнего поля
                Last_field_flag = 0;
                if (last_index + 1 == 72 - record_length + 1)
                    Last_field_flag = 1;
                end

                % обновление последнего индекса
                last_index = end_index;

                % необходимость чтения новой строки
                if (Last_field_flag == 1)

                    % конец файла
                    if (feof(Fin))
                        break; % конец карточки
                    end

                    % читаем строку
                    string_backup = previous_string;
                    previous_string = string;
                    string = fgets(Fin);

                    % проверка парности строк с идентификатором *
                    if ((next_string_large == 1) && (string(1) ~= '*'))
                        fprintf (1, '\nНепарная строка с идентификатором * в карточке RBE2 с номером %i !\n', MPC{MPC_read_counter}.ID);
                        ErrCode = -1;
                        return;
                    end

                    % проверка на записи в 10-ом поле
                    if (deblank(string) > 72)
                        fprintf (1, '\nОбнаружена запись в поле 10 карточки RBE2 с номером %i !\n', MPC{MPC_read_counter}.ID);
                        fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                        fprintf (1, 'Обратетись к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;
                    end
                    
                    % проверка первого символа
                    if (string(1) == '+')
                        fprintf (1, '\nПри считывании карточки RBE2 %i обнаружена строка, начинающаяся с символа + !\n', MPC{MPC_read_counter}.ID);
                        fprintf (1, 'Строки карточки RBE2, начинающиеся с символа +, не поддерживаются в текущей версии программы.\n');
                        fprintf (1, 'Обратетись к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;
                    end

                    % проверка первого символа
                    if (~((string(1) == '*') || (string(1) == ' ')))

                        fseek(Fin, -length(string), 'cof');
                        string = previous_string;
                        previous_string = string_backup;

                        break; % конец карточки

                    end

                    % строка * без полей
                    if ((string(1) == '*') && (length(strtrim(string)) == 1))
                        break; % конец карточки
                    end

                    % строка только из белых символов
                    if (isempty(strtrim(string)))
                        break; % конец карточки
                    end

                    % проверка длины строки
                    if (length(string) <= 2)
                        fprintf (1, '\nСтрока из двух или менее символов в карточке RBE2 с номером %i !\n', MPC{MPC_read_counter}.ID);
                        ErrCode = -1;
                        return;
                    end

                    % длина строки без конечных символов  
                    str_length = length(Trim_CR_LF(string));

                    % проверка длины строки
                    if (str_length < 8)
                        fprintf (1, '\nРазмер поля 1 меньше 8 символов в карточке RBE2 с номером %i !\n', MPC{MPC_read_counter}.ID);
                        ErrCode = -1;
                        return;
                    end

                    % установка параметров
                    switch string(1)

                        case ' '
                            last_index = 8;
                            record_length = 8;
                            next_string_large = 0;

                        case '*'
                            last_index = 8;
                            record_length = 16;
                            if (next_string_large == 0)
                                next_string_large = 1;
                            else
                                next_string_large = 0;
                            end

                    end

                end

            end

            % проверка на число узлов GM
            if (GM_counter == 0)
                fprintf (1, '\nНулевое число полей GMi карточки RBE2 с номером %i !\n', MPC{MPC_read_counter}.ID);
                ErrCode = -1;
                return;
            end

            % финализация массива
            MPC{MPC_read_counter}.GM = MPC{MPC_read_counter}.GM(1:GM_counter);


            % Для вывода прогресса
            Counter = Counter + 1;
            Counter_2 = Counter_2 + 1;
            if (Counter_2 == N_rec_segm)
                Counter_2 = 0;
                Written_count = Written_count + 1;
                if (Written_count < Time_segments)
                    fprintf (1, '#');
                    pause (Progress_Bar_Delay);
                end
            end


            continue;
            
        end
        
        if ((length(string) >= 5) && strcmp(string(2:5), 'BE2*')) % LARGE FIELD FORMAT
            
            MPC_read_counter = MPC_read_counter + 1;

            MPC{MPC_read_counter}.card = 'RBE2';
            MPC{MPC_read_counter}.ID = [];
            MPC{MPC_read_counter}.Nastran_ID = [];
            MPC{MPC_read_counter}.GN = [];
            MPC{MPC_read_counter}.CM = [];
            MPC{MPC_read_counter}.GM = zeros(N_RBE2_grids_preallocated,1);
            MPC{MPC_read_counter}.ALPHA = [];

            % Чтение ID
            if  ((length(previous_string) >= 38) && strcmp(previous_string(2:37), ' ID conflict : the PATRAN MPC ID was')) % здесь нет ошибки с 38 и 37

                tmp_number = str2double(previous_string(38:length(previous_string)));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером MPC в базе Patran в строке [%s] перед карточкой RBE2* !\n', previous_string(38:length(previous_string)));
                    ErrCode = -1;
                    return;
                end
                MPC{MPC_read_counter}.ID = tmp_number;

                Read_Prev_String_ID_counter = Read_Prev_String_ID_counter + 1;

                tmp_number = str2double(string(9:24));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером MPC в карточке RBE2* : [%s] !\n', strtrim(string(9:24)));
                    ErrCode = -1;
                    return;
                end
                MPC{MPC_read_counter}.Nastran_ID = tmp_number;

            else

                tmp_number = str2double(string(9:24));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером MPC в карточке RBE2* : [%s] !\n', strtrim(string(9:24)));
                    ErrCode = -1;
                    return;
                end
                MPC{MPC_read_counter}.ID = tmp_number;
                MPC{MPC_read_counter}.Nastran_ID = tmp_number;

            end

            % проверка на записи в 10-ом поле
            if (deblank(string) > 72)
                fprintf (1, '\nОбнаружена запись в поле 10 карточки RBE2* с номером %i !\n', MPC{MPC_read_counter}.ID);
                fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                fprintf (1, 'Обратетись к разработчику для решения этого вопроса.\n');
                ErrCode = -1;
                return;
            end

            % Чтение GN
            tmp_number = str2double(string(25:40));
            if (isnan(tmp_number))
                fprintf (1, '\nНеправильная запись GN в карточке RBE2* %i : [%s] !\n', MPC{MPC_read_counter}.ID, strtrim(string(25:40)));
                ErrCode = -1;
                return;
            end
            MPC{MPC_read_counter}.GN = tmp_number;

            % Чтение CM
            tmp_number = str2double(string(41:56));
            if (isnan(tmp_number))
                fprintf (1, '\nНеправильная запись CM в карточке RBE2* %i : [%s] !\n', MPC{MPC_read_counter}.ID, strtrim(string(41:56)));
                ErrCode = -1;
                return;
            end
            MPC{MPC_read_counter}.CM = tmp_number;

            % Чтение GMi
            First_GM_flag = 1;
            GM_counter = 0;

            % длина строки без конечных символов  
            str_length = length(Trim_CR_LF(string));

            while (1)

                % установка начальных значений параметров
                if (First_GM_flag == 1)

                    First_GM_flag = 0;

                    last_index = 56;
                    record_length = 16;
                    next_string_large = 1;

                end

                % конец карточки в случае пустого поля
                if (last_index == str_length)
                    break;
                end

                % последний индекс поля
                if (last_index + record_length <= str_length)
                    end_index = last_index + record_length;
                else
                    end_index = str_length;
                end

                % проверка на ALPHA
                if (~isempty(strfind(string(last_index + 1:end_index), '.'))) %#ok<STREMP> % Для совместимости с GNU Octave вместо if (contains(string(last_index + 1:end_index), '.'))

                    tmp_number = str2double(string(last_index + 1:end_index));
                    if (isnan(tmp_number))
                        tmp_number_2 = sscanf(string(last_index + 1:end_index), '%e%d');
                        if (size(tmp_number_2,1) ~= 2)
                            fprintf (1, '\nНеправильная запись ALPHA в карточке RBE2* %i : [%s] !\n', MPC{MPC_read_counter}.ID, strtrim(string(last_index + 1:end_index)));
                            ErrCode = -1;
                            return;
                        end
                       MPC{MPC_read_counter}.ALPHA = tmp_number_2(1)*10^tmp_number_2(2);
                    else
                        MPC{MPC_read_counter}.ALPHA = tmp_number;
                    end

                    break; % конец карточки

                end

                % считывание GMi
                tmp_number = str2double(string(last_index + 1:end_index));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись GMi в карточке RBE2* %i : [%s] !\n', MPC{MPC_read_counter}.ID, strtrim(string(last_index + 1:end_index)));
                    ErrCode = -1;
                    return;
                end
                GM_counter = GM_counter + 1;
                MPC{MPC_read_counter}.GM(GM_counter) = tmp_number;

                % проверка на поле не полной длины, которое не является последним
                if ((end_index - last_index < record_length) && (last_index + 1 < 72 - record_length + 1))
                    break; % конец карточки
                end

                % флаг последнего поля
                Last_field_flag = 0;
                if (last_index + 1 == 72 - record_length + 1)
                    Last_field_flag = 1;
                end

                % обновление последнего индекса
                last_index = end_index;

                % необходимость чтения новой строки
                if (Last_field_flag == 1)

                    % конец файла
                    if (feof(Fin))
                        break; % конец карточки
                    end

                    % читаем строку
                    string_backup = previous_string;
                    previous_string = string;
                    string = fgets(Fin);

                    % проверка парности строк с идентификатором *
                    if ((next_string_large == 1) && (string(1) ~= '*'))
                        fprintf (1, '\nНепарная строка с идентификатором * в карточке RBE2* с номером %i !\n', MPC{MPC_read_counter}.ID);
                        ErrCode = -1;
                        return;
                    end

                    % проверка на записи в 10-ом поле
                    if (deblank(string) > 72)
                        fprintf (1, '\nОбнаружена запись в поле 10 карточки RBE2* с номером %i !\n', MPC{MPC_read_counter}.ID);
                        fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                        fprintf (1, 'Обратетись к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;
                    end
                    
                    % проверка первого символа
                    if (string(1) == '+')
                        fprintf (1, '\nПри считывании карточки RBE2* %i обнаружена строка, начинающаяся с символа + !\n', MPC{MPC_read_counter}.ID);
                        fprintf (1, 'Строки карточки RBE2*, начинающиеся с символа +, не поддерживаются в текущей версии программы.\n');
                        fprintf (1, 'Обратетись к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;
                    end

                    % проверка первого символа
                    if (~((string(1) == '*') || (string(1) == ' ')))

                        fseek(Fin, -length(string), 'cof');
                        string = previous_string;
                        previous_string = string_backup;

                        break; % конец карточки

                    end

                    % строка * без полей
                    if ((string(1) == '*') && (length(strtrim(string)) == 1))
                        break; % конец карточки
                    end

                    % строка только из белых символов
                    if (isempty(strtrim(string)))
                        break; % конец карточки
                    end

                    % проверка длины строки
                    if (length(string) <= 2)
                        fprintf (1, '\nСтрока из двух или менее символов в карточке RBE2* с номером %i !\n', MPC{MPC_read_counter}.ID);
                        ErrCode = -1;
                        return;
                    end

                    % длина строки без конечных символов  
                    str_length = length(Trim_CR_LF(string));

                    % проверка длины строки
                    if (str_length < 8)
                        fprintf (1, '\nРазмер поля 1 меньше 8 символов в карточке RBE2* с номером %i !\n', MPC{MPC_read_counter}.ID);
                        ErrCode = -1;
                        return;
                    end

                    % установка параметров
                    switch string(1)

                        case ' '
                            last_index = 8;
                            record_length = 8;
                            next_string_large = 0;

                        case '*'
                            last_index = 8;
                            record_length = 16;
                            if (next_string_large == 0)
                                next_string_large = 1;
                            else
                                next_string_large = 0;
                            end

                    end

                end

            end

            % проверка на число узлов GM
            if (GM_counter == 0)
                fprintf (1, '\nНулевое число полей GMi карточки RBE2* с номером %i !\n', MPC{MPC_read_counter}.ID);
                ErrCode = -1;
                return;
            end

            % финализация массива
            MPC{MPC_read_counter}.GM = MPC{MPC_read_counter}.GM(1:GM_counter);


            % Для вывода прогресса
            Counter = Counter + 1;
            Counter_2 = Counter_2 + 1;
            if (Counter_2 == N_rec_segm)
                Counter_2 = 0;
                Written_count = Written_count + 1;
                if (Written_count < Time_segments)
                    fprintf (1, '#');
                    pause (Progress_Bar_Delay);
                end
            end


            continue;
            
        end
        
        if ((length(string) >= 5) && strcmp(string(2:5), 'BE2,')) % FREE FIELD FORMAT
            
            fprintf (1, '\nОшибка функции Read_MPC: FREE FIELD FORMAT файла bdf не поддерживается в текущей версии программы [RBE2,] !\n');
            ErrCode = -1;
            return; 
            
        end
        
        % Чтение RBE3
    
        if ((length(string) >= 5) && strcmp(string(2:5), 'BE3 ')) % SMALL FIELD FORMAT
            
            MPC_read_counter = MPC_read_counter + 1;

            MPC{MPC_read_counter}.card = 'RBE3';
            MPC{MPC_read_counter}.ID = [];
            MPC{MPC_read_counter}.Nastran_ID = [];
            MPC{MPC_read_counter}.REFGRID = [];
            MPC{MPC_read_counter}.REFC = [];
            MPC{MPC_read_counter}.INDEP_DATA = cell(N_RBE3_cells_preallocated,1);
            MPC{MPC_read_counter}.ALPHA = [];

            % Чтение ID
            if  ((length(previous_string) >= 38) && strcmp(previous_string(2:37), ' ID conflict : the PATRAN MPC ID was')) % здесь нет ошибки с 38 и 37

                tmp_number = str2double(previous_string(38:length(previous_string)));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером MPC в базе Patran в строке [%s] перед карточкой RBE3 !\n', previous_string(38:length(previous_string)));
                    ErrCode = -1;
                    return;
                end
                MPC{MPC_read_counter}.ID = tmp_number;

                Read_Prev_String_ID_counter = Read_Prev_String_ID_counter + 1;

                tmp_number = str2double(string(9:16));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером MPC в карточке RBE3 : [%s] !\n', strtrim(string(9:16)));
                    ErrCode = -1;
                    return;
                end
                MPC{MPC_read_counter}.Nastran_ID = tmp_number;

            else

                tmp_number = str2double(string(9:16));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером MPC в карточке RBE3 : [%s] !\n', strtrim(string(9:16)));
                    ErrCode = -1;
                    return;
                end
                MPC{MPC_read_counter}.ID = tmp_number;
                MPC{MPC_read_counter}.Nastran_ID = tmp_number;

            end

            % проверка на записи в 10-ом поле
            if (deblank(string) > 72)
                fprintf (1, '\nОбнаружена запись в поле 10 карточки RBE3 с номером %i !\n', MPC{MPC_read_counter}.ID);
                fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                fprintf (1, 'Обратетись к разработчику для решения этого вопроса.\n');
                ErrCode = -1;
                return;
            end

            % Проверка пустого поля №3
            tmp_number = str2double(string(17:24));
            if (~isnan(tmp_number))
                fprintf (1, '\nНепустое поле №3 в карточке RBE3 %i : [%s] !\n', MPC{MPC_read_counter}.ID, strtrim(string(17:24)));
                ErrCode = -1;
                return;
            end

            % Чтение REFGRID
            tmp_number = str2double(string(25:32));
            if (isnan(tmp_number))
                fprintf (1, '\nНеправильная запись REFGRID в карточке RBE3 %i : [%s] !\n', MPC{MPC_read_counter}.ID, strtrim(string(25:32)));
                ErrCode = -1;
                return;
            end
            MPC{MPC_read_counter}.REFGRID = tmp_number;

            % Чтение REFC
            tmp_number = str2double(string(33:40));
            if (isnan(tmp_number))
                fprintf (1, '\nНеправильная запись REFC в карточке RBE3 %i : [%s] !\n', MPC{MPC_read_counter}.ID, strtrim(string(33:40)));
                ErrCode = -1;
                return;
            end
            MPC{MPC_read_counter}.REFC = tmp_number;

            % Чтение INDEP_DATA
            First_INDEP_DATA_flag = 1;
            INDEP_DATA_counter = 0;

            % длина строки без конечных символов  
            str_length = length(Trim_CR_LF(string));

            while (1)

                % Установка начальных значений параметров
                if (First_INDEP_DATA_flag == 1)

                    First_INDEP_DATA_flag = 0;

                    last_index = 40;
                    record_length = 8;
                    next_string_large = 0;

                end
                
                New_line_req_flag = 0;
                
                % Перевод на следующую строку, если чтение перенеслось на строку * без полей
                if ((string(1) == '*') && (length(strtrim(string)) == 1))
                    New_line_req_flag = 1;
                end
                
                if (New_line_req_flag == 0)

                    % Конец карточки в случае пустого поля
                    if (last_index == str_length)

                        % финализация текущей ячейки
                        if (INDEP_DATA_counter > 0)

                            % проверка на пустое значение C
                            if (isempty(MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.C))
                                fprintf (1, '\nПустое поле Ci карточки RBE3 с номером %i !\n', MPC{MPC_read_counter}.ID);
                                ErrCode = -1;
                                return;
                            end

                            % проверка на число узлов G
                            if (G_counter == 0)
                                fprintf (1, '\nНулевое число полей Gij карточки RBE3 с номером %i !\n', MPC{MPC_read_counter}.ID);
                                ErrCode = -1;
                                return;
                            end

                            % финализация текущей ячейки
                            MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G = MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G(1:G_counter);

                        end

                        % требуется чтение новой строки, чтобы понять, наступил ли конец карточки
                        New_line_req_flag = 1;
                    end
                
                end
                
                if (New_line_req_flag == 0)

                    % Последний индекс поля
                    if (last_index + record_length <= str_length)
                        end_index = last_index + record_length;
                    else
                        end_index = str_length;
                    end

                    % Проверка на WTi
                    WT_find_flag = 0;

                    if (~isempty(strfind(string(last_index + 1:end_index), '.'))) %#ok<STREMP> % Для совместимости с GNU Octave вместо if (contains(string(last_index + 1:end_index), '.'))

                        WT_find_flag = 1;

                        tmp_number = str2double(string(last_index + 1:end_index));
                        if (isnan(tmp_number))
                            tmp_number_2 = sscanf(string(last_index + 1:end_index), '%e%d');
                            if (size(tmp_number_2,1) ~= 2)
                                fprintf (1, '\nНеправильная запись WTi в карточке RBE3 %i : [%s] !\n', MPC{MPC_read_counter}.ID, strtrim(string(last_index + 1:end_index)));
                                ErrCode = -1;
                                return;
                            end
                            tmp_number_3 = tmp_number_2(1)*10^tmp_number_2(2);
                        else
                            tmp_number_3 = tmp_number;
                        end

                        % финализация текущей ячейки
                        if (INDEP_DATA_counter > 0)

                            % проверка на пустое значение C
                            if (isempty(MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.C))
                                fprintf (1, '\nПустое поле Ci карточки RBE3 с номером %i !\n', MPC{MPC_read_counter}.ID);
                                ErrCode = -1;
                                return;
                            end

                            % проверка на число узлов G
                            if (G_counter == 0)
                                fprintf (1, '\nНулевое число полей Gij карточки RBE3 с номером %i !\n', MPC{MPC_read_counter}.ID);
                                ErrCode = -1;
                                return;
                            end

                            % финализация текущей ячейки
                            MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G = MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G(1:G_counter);

                        end

                        % открываем новую ячейку
                        INDEP_DATA_counter = INDEP_DATA_counter + 1;
                        MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.WT = tmp_number_3;
                        MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.C = [];
                        MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G = zeros(N_RBE3_grids_in_cell_preallocated,1);
                        G_counter = 0;
                        Next_record_C_flag = 1;

                        % проверка на поле не полной длины, которое не является последним
                        if ((end_index - last_index < record_length) && (last_index + 1 < 72 - record_length + 1))

                            % финализация текущей ячейки
                            if (INDEP_DATA_counter > 0)

                                % проверка на пустое значение C
                                if (isempty(MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.C))
                                    fprintf (1, '\nПустое поле Ci карточки RBE3 с номером %i !\n', MPC{MPC_read_counter}.ID);
                                    ErrCode = -1;
                                    return;
                                end

                                % проверка на число узлов G
                                if (G_counter == 0)
                                    fprintf (1, '\nНулевое число полей Gij карточки RBE3 с номером %i !\n', MPC{MPC_read_counter}.ID);
                                    ErrCode = -1;
                                    return;
                                end

                                % финализация текущей ячейки
                                MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G = MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G(1:G_counter);

                            end

                            % требуется чтение новой строки, чтобы понять, наступил ли конец карточки
                            New_line_req_flag = 1;
                        end

                        % флаг последнего поля
                        Last_field_flag = 0;
                        if (last_index + 1 == 72 - record_length + 1)
                            Last_field_flag = 1;
                        end

                        % обновление последнего индекса
                        last_index = end_index;

                    end

                    % если данное поле было полем WTi, то сразу переходим к проверке на необходимость смены строки
                    % если нет, то читаем Ci или Gij
                    if (WT_find_flag == 0)

                        % считывание Ci или Gij
                        tmp_number = str2double(string(last_index + 1:end_index));
                        if (isnan(tmp_number))
                            % проверка обнаружения UM или ALPHA не в том месте
                            if(~isempty(strtrim(string(last_index + 1:end_index))))
                                if (strcmp(strtrim(string(last_index + 1:end_index)), 'UM'))
                                    fprintf (1, '\nНесвоевременное появление идентификатора UM в карточке RBE3 с номером %i !\n', MPC{MPC_read_counter}.ID);
                                    ErrCode = -1;
                                    return;
                                end
                                if (strcmp(strtrim(string(last_index + 1:end_index)), 'ALPHA'))
                                    fprintf (1, '\nНесвоевременное появление идентификатора ALPHA в карточке RBE3 с номером %i !\n', MPC{MPC_read_counter}.ID);
                                    ErrCode = -1;
                                    return;
                                end
                            end
                            % выдача сообщения об ошибке в зависимости от вида поля
                            if (Next_record_C_flag == 1)
                                fprintf (1, '\nНеправильная запись Ci в карточке RBE3 %i : [%s] !\n', MPC{MPC_read_counter}.ID, strtrim(string(last_index + 1:end_index)));
                            else
                                fprintf (1, '\nНеправильная запись Gij в карточке RBE3 %i : [%s] !\n', MPC{MPC_read_counter}.ID, strtrim(string(last_index + 1:end_index)));
                            end
                            ErrCode = -1;
                            return;
                        end
                        if (Next_record_C_flag == 1)
                            Next_record_C_flag = 0;
                            MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.C = tmp_number;
                        else 
                            G_counter = G_counter + 1;
                            MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G(G_counter) = tmp_number;
                        end

                        % проверка на поле не полной длины, которое не является последним
                        if ((end_index - last_index < record_length) && (last_index + 1 < 72 - record_length + 1))

                            % финализация текущей ячейки
                            if (INDEP_DATA_counter > 0)

                                % проверка на пустое значение C
                                if (isempty(MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.C))
                                    fprintf (1, '\nПустое поле Ci карточки RBE3 с номером %i !\n', MPC{MPC_read_counter}.ID);
                                    ErrCode = -1;
                                    return;
                                end

                                % проверка на число узлов G
                                if (G_counter == 0)
                                    fprintf (1, '\nНулевое число полей Gij карточки RBE3 с номером %i !\n', MPC{MPC_read_counter}.ID);
                                    ErrCode = -1;
                                    return;
                                end

                                % финализация текущей ячейки
                                MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G = MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G(1:G_counter);

                            end
                            
                            % требуется чтение новой строки, чтобы понять, наступил ли конец карточки
                            New_line_req_flag = 1;
                        end

                        % флаг последнего поля
                        Last_field_flag = 0;
                        if (last_index + 1 == 72 - record_length + 1)
                            Last_field_flag = 1;
                        end

                        % обновление последнего индекса
                        last_index = end_index;

                    end
                
                end

                % необходимость чтения новой строки
                if ((Last_field_flag == 1) || (New_line_req_flag == 1))

                    % конец файла
                    if (feof(Fin))

                        % финализация текущей ячейки
                        if (INDEP_DATA_counter > 0)

                            % проверка на пустое значение C
                            if (isempty(MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.C))
                                fprintf (1, '\nПустое поле Ci карточки RBE3 с номером %i !\n', MPC{MPC_read_counter}.ID);
                                ErrCode = -1;
                                return;
                            end

                            % проверка на число узлов G
                            if (G_counter == 0)
                                fprintf (1, '\nНулевое число полей Gij карточки RBE3 с номером %i !\n', MPC{MPC_read_counter}.ID);
                                ErrCode = -1;
                                return;
                            end

                            % финализация текущей ячейки
                            MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G = MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G(1:G_counter);

                        end

                        break; % конец карточки
                    end

                    % читаем строку
                    string_backup = previous_string;
                    previous_string = string;
                    string = fgets(Fin);

                    % проверка парности строк с идентификатором *
                    if ((next_string_large == 1) && (string(1) ~= '*'))
                        fprintf (1, '\nНепарная строка с идентификатором * в карточке RBE3 с номером %i !\n', MPC{MPC_read_counter}.ID);
                        ErrCode = -1;
                        return;
                    end
                    
                    % проверка первого символа
                    if (string(1) == '+')
                        fprintf (1, '\nПри считывании карточки RBE3 %i обнаружена строка, начинающаяся с символа + !\n', MPC{MPC_read_counter}.ID);
                        fprintf (1, 'Строки карточки RBE3, начинающиеся с символа +, не поддерживаются в текущей версии программы.\n');
                        fprintf (1, 'Обратетись к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;
                    end

                    % проверка первого символа
                    if (~((string(1) == '*') || (string(1) == ' ')))

                        fseek(Fin, -length(string), 'cof');
                        string = previous_string;
                        previous_string = string_backup;

                        % финализация текущей ячейки
                        if (INDEP_DATA_counter > 0)

                            % проверка на пустое значение C
                            if (isempty(MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.C))
                                fprintf (1, '\nПустое поле Ci карточки RBE3 с номером %i !\n', MPC{MPC_read_counter}.ID);
                                ErrCode = -1;
                                return;
                            end

                            % проверка на число узлов G
                            if (G_counter == 0)
                                fprintf (1, '\nНулевое число полей Gij карточки RBE3 с номером %i !\n', MPC{MPC_read_counter}.ID);
                                ErrCode = -1;
                                return;
                            end

                            % финализация текущей ячейки
                            MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G = MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G(1:G_counter);

                        end

                        break; % конец карточки

                    end
                    
                    % проверка на записи в 10-ом поле
                    if (deblank(string) > 72)
                        fprintf (1, '\nОбнаружена запись в поле 10 карточки RBE3 с номером %i !\n', MPC{MPC_read_counter}.ID);
                        fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                        fprintf (1, 'Обратетись к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;
                    end

                    % строка только из белых символов
                    if (isempty(strtrim(string)))

                        % финализация текущей ячейки
                        if (INDEP_DATA_counter > 0)

                            % проверка на пустое значение C
                            if (isempty(MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.C))
                                fprintf (1, '\nПустое поле Ci карточки RBE3 с номером %i !\n', MPC{MPC_read_counter}.ID);
                                ErrCode = -1;
                                return;
                            end

                            % проверка на число узлов G
                            if (G_counter == 0)
                                fprintf (1, '\nНулевое число полей Gij карточки RBE3 с номером %i !\n', MPC{MPC_read_counter}.ID);
                                ErrCode = -1;
                                return;
                            end

                            % финализация текущей ячейки
                            MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G = MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G(1:G_counter);

                        end

                        break; % конец карточки
                    end

                    % длина строки без конечных символов  
                    str_length = length(Trim_CR_LF(string));

                    % установка параметров
                    switch string(1)

                        case ' '
                            last_index = 8;
                            record_length = 8;
                            next_string_large = 0;

                        case '*'
                            last_index = 8;
                            record_length = 16;
                            if (next_string_large == 0)
                                next_string_large = 1;
                            else
                                next_string_large = 0;
                            end

                    end

                    % проверка на наличие идентификаторов UM или ALPHA во втором поле
                    if (str_length >= 9)
                        if (str_length >= 8 + record_length)
                            End_index = 8 + record_length;
                        else
                            End_index = str_length;
                        end
                        if(~isempty(strtrim(string(9:End_index))))
                            if (strcmp(strtrim(string(9:End_index)), 'UM'))
                                fprintf (1, '\nОбнаружен идентификатор UM в карточке RBE3 с номером %i !\n', MPC{MPC_read_counter}.ID);
                                fprintf (1, 'Поля UM в карточке RBE3 не поддерживаются в текущей версии программы.\n');
                                fprintf (1, 'Обратетись к разработчику для решения этого вопроса.\n');
                                ErrCode = -1;
                                return;
                            end
                            if (strcmp(strtrim(string(9:End_index)), 'ALPHA'))

                                % Чтение ALPHA и конец карточки

                                if (length(string) < 8 + 2*record_length)
                                    End_index = length(string);
                                else
                                    End_index = 8 + 2*record_length;
                                end

                                tmp_number = str2double(string(8 + record_length + 1:End_index));
                                if (isnan(tmp_number))
                                    tmp_number_2 = sscanf(string(8 + record_length + 1:End_index), '%e%d');
                                    if (size(tmp_number_2,1) ~= 2)
                                        fprintf (1, '\nНеправильная запись ALPHA в карточке RBE3 %i : [%s] !\n', MPC{MPC_read_counter}.ID, strtrim(string(58 + record_length + 1:End_index)));
                                        ErrCode = -1;
                                        return;
                                    end
                                    MPC{MPC_read_counter}.ALPHA = tmp_number_2(1)*10^tmp_number_2(2);
                                else
                                    MPC{MPC_read_counter}.ALPHA = tmp_number;
                                end

                                % финализация текущей ячейки
                                if (INDEP_DATA_counter > 0)

                                    % проверка на пустое значение C
                                    if (isempty(MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.C))
                                        fprintf (1, '\nПустое поле Ci карточки RBE3 с номером %i !\n', MPC{MPC_read_counter}.ID);
                                        ErrCode = -1;
                                        return;
                                    end

                                    % проверка на число узлов G
                                    if (G_counter == 0)
                                        fprintf (1, '\nНулевое число полей Gij карточки RBE3 с номером %i !\n', MPC{MPC_read_counter}.ID);
                                        ErrCode = -1;
                                        return;
                                    end

                                    % финализация текущей ячейки
                                    MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G = MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G(1:G_counter);

                                end

                                break; % конец карточки

                            end
                            
                        end

                    end

                end

            end

            % проверка на число ячеек INDEP_DATA
            if (INDEP_DATA_counter == 0)
                fprintf (1, '\nНулевое число полей WTi в карточке RBE3 с номером %i !\n', MPC{MPC_read_counter}.ID);
                ErrCode = -1;
                return;
            end

            % финализация массива ячеек INDEP_DATA
            MPC{MPC_read_counter}.INDEP_DATA = MPC{MPC_read_counter}.INDEP_DATA(1:INDEP_DATA_counter);


            % Для вывода прогресса
            Counter = Counter + 1;
            Counter_2 = Counter_2 + 1;
            if (Counter_2 == N_rec_segm)
                Counter_2 = 0;
                Written_count = Written_count + 1;
                if (Written_count < Time_segments)
                    fprintf (1, '#');
                    pause (Progress_Bar_Delay);
                end
            end


            continue;
            
        end
        
        if ((length(string) >= 5) && strcmp(string(2:5), 'BE3*')) % LARGE FIELD FORMAT
            
            MPC_read_counter = MPC_read_counter + 1;

            MPC{MPC_read_counter}.card = 'RBE3';
            MPC{MPC_read_counter}.ID = [];
            MPC{MPC_read_counter}.Nastran_ID = [];
            MPC{MPC_read_counter}.REFGRID = [];
            MPC{MPC_read_counter}.REFC = [];
            MPC{MPC_read_counter}.INDEP_DATA = cell(N_RBE3_cells_preallocated,1);
            MPC{MPC_read_counter}.ALPHA = [];

            % Чтение ID
            if  ((length(previous_string) >= 38) && strcmp(previous_string(2:37), ' ID conflict : the PATRAN MPC ID was')) % здесь нет ошибки с 38 и 37

                tmp_number = str2double(previous_string(38:length(previous_string)));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером MPC в базе Patran в строке [%s] перед карточкой RBE3* !\n', previous_string(38:length(previous_string)));
                    ErrCode = -1;
                    return;
                end
                MPC{MPC_read_counter}.ID = tmp_number;

                Read_Prev_String_ID_counter = Read_Prev_String_ID_counter + 1;

                tmp_number = str2double(string(9:24));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером MPC в карточке RBE3* : [%s] !\n', strtrim(string(9:24)));
                    ErrCode = -1;
                    return;
                end
                MPC{MPC_read_counter}.Nastran_ID = tmp_number;

            else

                tmp_number = str2double(string(9:24));
                if (isnan(tmp_number))
                    fprintf (1, '\nНеправильная запись с номером MPC в карточке RBE3* : [%s] !\n', strtrim(string(9:24)));
                    ErrCode = -1;
                    return;
                end
                MPC{MPC_read_counter}.ID = tmp_number;
                MPC{MPC_read_counter}.Nastran_ID = tmp_number;

            end

            % проверка на записи в 10-ом поле
            if (deblank(string) > 72)
                fprintf (1, '\nОбнаружена запись в поле 10 карточки RBE3* с номером %i !\n', MPC{MPC_read_counter}.ID);
                fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                fprintf (1, 'Обратетись к разработчику для решения этого вопроса.\n');
                ErrCode = -1;
                return;
            end

            % Проверка пустого поля №3
            tmp_number = str2double(string(25:40));
            if (~isnan(tmp_number))
                fprintf (1, '\nНепустое поле №3 в карточке RBE3* %i : [%s] !\n', MPC{MPC_read_counter}.ID, strtrim(string(25:40)));
                ErrCode = -1;
                return;
            end

            % Чтение REFGRID
            tmp_number = str2double(string(41:56));
            if (isnan(tmp_number))
                fprintf (1, '\nНеправильная запись REFGRID в карточке RBE3* %i : [%s] !\n', MPC{MPC_read_counter}.ID, strtrim(string(41:56)));
                ErrCode = -1;
                return;
            end
            MPC{MPC_read_counter}.REFGRID = tmp_number;

            % Чтение REFC
            if (length(string) < 72)
                End_index = length(string);
            else
                End_index = 72;
            end
            tmp_number = str2double(string(57:End_index));
            if (isnan(tmp_number))
                fprintf (1, '\nНеправильная запись REFC в карточке RBE3* %i : [%s] !\n', MPC{MPC_read_counter}.ID, strtrim(string(57:End_index)));
                ErrCode = -1;
                return;
            end
            MPC{MPC_read_counter}.REFC = tmp_number;

            % Проверка на конец файла
            if (feof(Fin))
                fprintf (1, '\nНеожиданный конец файла во время чтения карточки RBE3* с номером %i !\n', MPC{MPC_read_counter}.ID);
                ErrCode = -1;
                return;
            end

            % Чтение следующей строки
            previous_string = string;
            string = fgets(Fin);

            % Проверка строки
            if (~(string(1) == '*'))
                fprintf (1, '\nВторая строка в карточке RBE3* %i не начинается с символа * !\n', MPC{MPC_read_counter}.ID);
                ErrCode = -1;
                return;
            end

            % проверка на записи в 10-ом поле
            if (deblank(string) > 72)
                fprintf (1, '\nОбнаружена запись в поле 10 карточки RBE3* с номером %i !\n', MPC{MPC_read_counter}.ID);
                fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                fprintf (1, 'Обратетись к разработчику для решения этого вопроса.\n');
                ErrCode = -1;
                return;
            end

            % Чтение INDEP_DATA
            First_INDEP_DATA_flag = 1;
            INDEP_DATA_counter = 0;

            % длина строки без конечных символов  
            str_length = length(Trim_CR_LF(string));

            % проверка длины строки
            if (str_length < 8)
                fprintf (1, '\nРазмер поля 1 меньше 8 символов в карточке RBE3* с номером %i !\n', MPC{MPC_read_counter}.ID);
                ErrCode = -1;
                return;
            end

            while (1)

                % Установка начальных значений параметров
                if (First_INDEP_DATA_flag == 1)

                    First_INDEP_DATA_flag = 0;

                    last_index = 8;
                    record_length = 16;
                    next_string_large = 0;

                end
                
                New_line_req_flag = 0;
                
                % Перевод на следующую строку, если чтение перенеслось на строку * без полей
                if ((string(1) == '*') && (length(strtrim(string)) == 1))
                    New_line_req_flag = 1;
                end
                
                if (New_line_req_flag == 0)

                    % Конец карточки в случае пустого поля
                    if (last_index == str_length)

                        % финализация текущей ячейки
                        if (INDEP_DATA_counter > 0)

                            % проверка на пустое значение C
                            if (isempty(MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.C))
                                fprintf (1, '\nПустое поле Ci карточки RBE3* с номером %i !\n', MPC{MPC_read_counter}.ID);
                                ErrCode = -1;
                                return;
                            end

                            % проверка на число узлов G
                            if (G_counter == 0)
                                fprintf (1, '\nНулевое число полей Gij карточки RBE3* с номером %i !\n', MPC{MPC_read_counter}.ID);
                                ErrCode = -1;
                                return;
                            end

                            % финализация текущей ячейки
                            MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G = MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G(1:G_counter);

                        end

                        % требуется чтение новой строки, чтобы понять, наступил ли конец карточки
                        New_line_req_flag = 1;
                    end
                
                end
                
                if (New_line_req_flag == 0)

                    % Последний индекс поля
                    if (last_index + record_length <= str_length)
                        end_index = last_index + record_length;
                    else
                        end_index = str_length;
                    end

                    % Проверка на WTi
                    WT_find_flag = 0;

                    if (~isempty(strfind(string(last_index + 1:end_index), '.'))) %#ok<STREMP> % Для совместимости с GNU Octave вместо if (contains(string(last_index + 1:end_index), '.'))

                        WT_find_flag = 1;

                        tmp_number = str2double(string(last_index + 1:end_index));
                        if (isnan(tmp_number))
                            tmp_number_2 = sscanf(string(last_index + 1:end_index), '%e%d');
                            if (size(tmp_number_2,1) ~= 2)
                                fprintf (1, '\nНеправильная запись WTi в карточке RBE3* %i : [%s] !\n', MPC{MPC_read_counter}.ID, strtrim(string(last_index + 1:end_index)));
                                ErrCode = -1;
                                return;
                            end
                            tmp_number_3 = tmp_number_2(1)*10^tmp_number_2(2);
                        else
                            tmp_number_3 = tmp_number;
                        end

                        % финализация текущей ячейки
                        if (INDEP_DATA_counter > 0)

                            % проверка на пустое значение C
                            if (isempty(MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.C))
                                fprintf (1, '\nПустое поле Ci карточки RBE3* с номером %i !\n', MPC{MPC_read_counter}.ID);
                                ErrCode = -1;
                                return;
                            end

                            % проверка на число узлов G
                            if (G_counter == 0)
                                fprintf (1, '\nНулевое число полей Gij карточки RBE3* с номером %i !\n', MPC{MPC_read_counter}.ID);
                                ErrCode = -1;
                                return;
                            end

                            % финализация текущей ячейки
                            MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G = MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G(1:G_counter);

                        end

                        % открываем новую ячейку
                        INDEP_DATA_counter = INDEP_DATA_counter + 1;
                        MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.WT = tmp_number_3;
                        MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.C = [];
                        MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G = zeros(N_RBE3_grids_in_cell_preallocated,1);
                        G_counter = 0;
                        Next_record_C_flag = 1;

                        % проверка на поле не полной длины, которое не является последним
                        if ((end_index - last_index < record_length) && (last_index + 1 < 72 - record_length + 1))

                            % финализация текущей ячейки
                            if (INDEP_DATA_counter > 0)

                                % проверка на пустое значение C
                                if (isempty(MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.C))
                                    fprintf (1, '\nПустое поле Ci карточки RBE3* с номером %i !\n', MPC{MPC_read_counter}.ID);
                                    ErrCode = -1;
                                    return;
                                end

                                % проверка на число узлов G
                                if (G_counter == 0)
                                    fprintf (1, '\nНулевое число полей Gij карточки RBE3* с номером %i !\n', MPC{MPC_read_counter}.ID);
                                    ErrCode = -1;
                                    return;
                                end

                                % финализация текущей ячейки
                                MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G = MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G(1:G_counter);

                            end

                            % требуется чтение новой строки, чтобы понять, наступил ли конец карточки
                            New_line_req_flag = 1;
                        end

                        % флаг последнего поля
                        Last_field_flag = 0;
                        if (last_index + 1 == 72 - record_length + 1)
                            Last_field_flag = 1;
                        end

                        % обновление последнего индекса
                        last_index = end_index;
                    end

                    % если данное поле было полем WTi, то сразу переходим к проверке на необходимость смены строки
                    % если нет, то читаем Ci или Gij
                    if (WT_find_flag == 0)

                        % считывание Ci или Gij
                        tmp_number = str2double(string(last_index + 1:end_index));
                        if (isnan(tmp_number))
                            % проверка обнаружения UM или ALPHA не в том месте
                            if(~isempty(strtrim(string(last_index + 1:end_index))))
                                if (strcmp(strtrim(string(last_index + 1:end_index)), 'UM'))
                                    fprintf (1, '\nНесвоевременное появление идентификатора UM в карточке RBE3* с номером %i !\n', MPC{MPC_read_counter}.ID);
                                    ErrCode = -1;
                                    return;
                                end
                                if (strcmp(strtrim(string(last_index + 1:end_index)), 'ALPHA'))
                                    fprintf (1, '\nНесвоевременное появление идентификатора ALPHA в карточке RBE3* с номером %i !\n', MPC{MPC_read_counter}.ID);
                                    ErrCode = -1;
                                    return;
                                end
                            end
                            % выдача сообщения об ошибке в зависимости от вида поля
                            if (Next_record_C_flag == 1)
                                fprintf (1, '\nНеправильная запись Ci в карточке RBE3* %i : [%s] !\n', MPC{MPC_read_counter}.ID, strtrim(string(last_index + 1:end_index)));
                            else
                                fprintf (1, '\nНеправильная запись Gij в карточке RBE3* %i : [%s] !\n', MPC{MPC_read_counter}.ID, strtrim(string(last_index + 1:end_index)));
                            end
                            ErrCode = -1;
                            return;
                        end
                        if (Next_record_C_flag == 1)
                            Next_record_C_flag = 0;
                            MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.C = tmp_number;
                        else 
                            G_counter = G_counter + 1;
                            MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G(G_counter) = tmp_number;
                        end

                        % проверка на поле не полной длины, которое не является последним
                        if ((end_index - last_index < record_length) && (last_index + 1 < 72 - record_length + 1))

                            % финализация текущей ячейки
                            if (INDEP_DATA_counter > 0)

                                % проверка на пустое значение C
                                if (isempty(MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.C))
                                    fprintf (1, '\nПустое поле Ci карточки RBE3* с номером %i !\n', MPC{MPC_read_counter}.ID);
                                    ErrCode = -1;
                                    return;
                                end

                                % проверка на число узлов G
                                if (G_counter == 0)
                                    fprintf (1, '\nНулевое число полей Gij карточки RBE3* с номером %i !\n', MPC{MPC_read_counter}.ID);
                                    ErrCode = -1;
                                    return;
                                end

                                % финализация текущей ячейки
                                MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G = MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G(1:G_counter);

                            end

                            % требуется чтение новой строки, чтобы понять, наступил ли конец карточки
                            New_line_req_flag = 1;
                        end

                        % флаг последнего поля
                        Last_field_flag = 0;
                        if (last_index + 1 == 72 - record_length + 1)
                            Last_field_flag = 1;
                        end

                        % обновление последнего индекса
                        last_index = end_index;

                    end
                
                end

                % необходимость чтения новой строки
                if ((Last_field_flag == 1) || (New_line_req_flag == 1))

                    % конец файла
                    if (feof(Fin))

                        % финализация текущей ячейки
                        if (INDEP_DATA_counter > 0)

                            % проверка на пустое значение C
                            if (isempty(MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.C))
                                fprintf (1, '\nПустое поле Ci карточки RBE3* с номером %i !\n', MPC{MPC_read_counter}.ID);
                                ErrCode = -1;
                                return;
                            end

                            % проверка на число узлов G
                            if (G_counter == 0)
                                fprintf (1, '\nНулевое число полей Gij карточки RBE3* с номером %i !\n', MPC{MPC_read_counter}.ID);
                                ErrCode = -1;
                                return;
                            end

                            % финализация текущей ячейки
                            MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G = MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G(1:G_counter);

                        end

                        break; % конец карточки
                    end

                    % читаем строку
                    string_backup = previous_string;
                    previous_string = string;
                    string = fgets(Fin);

                    % проверка парности строк с идентификатором *
                    if ((next_string_large == 1) && (string(1) ~= '*'))
                        fprintf (1, '\nНепарная строка с идентификатором * в карточке RBE3* с номером %i !\n', MPC{MPC_read_counter}.ID);
                        ErrCode = -1;
                        return;
                    end
                    
                    % проверка первого символа
                    if (string(1) == '+')
                        fprintf (1, '\nПри считывании карточки RBE3* %i обнаружена строка, начинающаяся с символа + !\n', MPC{MPC_read_counter}.ID);
                        fprintf (1, 'Строки карточки RBE3*, начинающиеся с символа +, не поддерживаются в текущей версии программы.\n');
                        fprintf (1, 'Обратетись к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;
                    end

                    % проверка первого символа
                    if (~((string(1) == '*') || (string(1) == ' ')))

                        fseek(Fin, -length(string), 'cof');
                        string = previous_string;
                        previous_string = string_backup;

                        % финализация текущей ячейки
                        if (INDEP_DATA_counter > 0)

                            % проверка на пустое значение C
                            if (isempty(MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.C))
                                fprintf (1, '\nПустое поле Ci карточки RBE3* с номером %i !\n', MPC{MPC_read_counter}.ID);
                                ErrCode = -1;
                                return;
                            end

                            % проверка на число узлов G
                            if (G_counter == 0)
                                fprintf (1, '\nНулевое число полей Gij карточки RBE3* с номером %i !\n', MPC{MPC_read_counter}.ID);
                                ErrCode = -1;
                                return;
                            end

                            % финализация текущей ячейки
                            MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G = MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G(1:G_counter);

                        end

                        break; % конец карточки

                    end
                    
                    % проверка на записи в 10-ом поле
                    if (deblank(string) > 72)
                        fprintf (1, '\nОбнаружена запись в поле 10 карточки RBE3* с номером %i !\n', MPC{MPC_read_counter}.ID);
                        fprintf (1, 'Указатели продления карточки не поддерживаются в текущей версии программы.\n');
                        fprintf (1, 'Обратетись к разработчику для решения этого вопроса.\n');
                        ErrCode = -1;
                        return;
                    end

                    % строка только из белых символов
                    if (isempty(strtrim(string)))

                        % финализация текущей ячейки
                        if (INDEP_DATA_counter > 0)

                            % проверка на пустое значение C
                            if (isempty(MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.C))
                                fprintf (1, '\nПустое поле Ci карточки RBE3* с номером %i !\n', MPC{MPC_read_counter}.ID);
                                ErrCode = -1;
                                return;
                            end

                            % проверка на число узлов G
                            if (G_counter == 0)
                                fprintf (1, '\nНулевое число полей Gij карточки RBE3* с номером %i !\n', MPC{MPC_read_counter}.ID);
                                ErrCode = -1;
                                return;
                            end

                            % финализация текущей ячейки
                            MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G = MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G(1:G_counter);

                        end

                        break; % конец карточки
                    end

                    % длина строки без конечных символов  
                    str_length = length(Trim_CR_LF(string));

                    % установка параметров
                    switch string(1)

                        case ' '
                            last_index = 8;
                            record_length = 8;
                            next_string_large = 0;

                        case '*'
                            last_index = 8;
                            record_length = 16;
                            if (next_string_large == 0)
                                next_string_large = 1;
                            else
                                next_string_large = 0;
                            end

                    end

                    % проверка на наличие идентификаторов UM или ALPHA во втором поле
                    if (str_length >= 9)
                        if (str_length >= 8 + record_length)
                            End_index = 8 + record_length;
                        else
                            End_index = str_length;
                        end
                        if(~isempty(strtrim(string(9:End_index))))
                            if (strcmp(strtrim(string(9:End_index)), 'UM'))
                                fprintf (1, '\nОбнаружен идентификатор UM в карточке RBE3* с номером %i !\n', MPC{MPC_read_counter}.ID);
                                fprintf (1, 'Поля UM в карточке RBE3 не поддерживаются в текущей версии программы.\n');
                                fprintf (1, 'Обратетись к разработчику для решения этого вопроса.\n');
                                ErrCode = -1;
                                return;
                            end
                            if (strcmp(strtrim(string(9:End_index)), 'ALPHA'))

                                % Чтение ALPHA и конец карточки

                                if (length(string) < 8 + 2*record_length)
                                    End_index = length(string);
                                else
                                    End_index = 8 + 2*record_length;
                                end

                                tmp_number = str2double(string(8 + record_length + 1:End_index));
                                if (isnan(tmp_number))
                                    tmp_number_2 = sscanf(string(8 + record_length + 1:End_index), '%e%d');
                                    if (size(tmp_number_2,1) ~= 2)
                                        fprintf (1, '\nНеправильная запись ALPHA в карточке RBE3* %i : [%s] !\n', MPC{MPC_read_counter}.ID, strtrim(string(58 + record_length + 1:End_index)));
                                        ErrCode = -1;
                                        return;
                                    end
                                    MPC{MPC_read_counter}.ALPHA = tmp_number_2(1)*10^tmp_number_2(2);
                                else
                                    MPC{MPC_read_counter}.ALPHA = tmp_number;
                                end

                                % финализация текущей ячейки
                                if (INDEP_DATA_counter > 0)

                                    % проверка на пустое значение C
                                    if (isempty(MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.C))
                                        fprintf (1, '\nПустое поле Ci карточки RBE3* с номером %i !\n', MPC{MPC_read_counter}.ID);
                                        ErrCode = -1;
                                        return;
                                    end

                                    % проверка на число узлов G
                                    if (G_counter == 0)
                                        fprintf (1, '\nНулевое число полей Gij карточки RBE3* с номером %i !\n', MPC{MPC_read_counter}.ID);
                                        ErrCode = -1;
                                        return;
                                    end

                                    % финализация текущей ячейки
                                    MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G = MPC{MPC_read_counter}.INDEP_DATA{INDEP_DATA_counter}.G(1:G_counter);

                                end

                                break; % конец карточки

                            end
                            
                        end

                    end

                end

            end

            % проверка на число ячеек INDEP_DATA
            if (INDEP_DATA_counter == 0)
                fprintf (1, '\nНулевое число полей WTi в карточке RBE3* с номером %i !\n', MPC{MPC_read_counter}.ID);
                ErrCode = -1;
                return;
            end

            % финализация массива ячеек INDEP_DATA
            MPC{MPC_read_counter}.INDEP_DATA = MPC{MPC_read_counter}.INDEP_DATA(1:INDEP_DATA_counter);


            % Для вывода прогресса
            Counter = Counter + 1;
            Counter_2 = Counter_2 + 1;
            if (Counter_2 == N_rec_segm)
                Counter_2 = 0;
                Written_count = Written_count + 1;
                if (Written_count < Time_segments)
                    fprintf (1, '#');
                    pause (Progress_Bar_Delay);
                end
            end


            continue;
            
        end
        
        if ((length(string) >= 5) && strcmp(string(2:5), 'BE3,')) % FREE FIELD FORMAT
            
            fprintf (1, '\nОшибка функции Read_MPC: FREE FIELD FORMAT файла bdf не поддерживается в текущей версии программы [RBE3,] !\n');
            ErrCode = -1;
            return; 
            
        end
        
    end
    
end


% Для вывода прогресса
if (N_rec_segm == 0)
    for i=1:Time_segments-1
        fprintf (1, '#');
        pause (Progress_Bar_Delay);
    end
end
fprintf (1, '# ');
pause (Progress_Bar_Delay);


% Обработка исключений
if (MPC_read_counter < N_MPC)
    fprintf (1, '\nОшибка функции Read_MPC: MPC_read_counter < N_MPC !\n');
    ErrCode = -1;
    return;        
end

if (Read_Prev_String_ID_counter ~= MPC_ID_Conflict_counter)
    fprintf (1, '\nЧисло конфликтов номеров MPC, обнаруженных в bdf файле, не совпадает с числом записей, считанным из комментариев перед карточками !\n');
    ErrCode = -1;
    return; 
end

fprintf (1, 'OK!\n');
